#include <iostream>
#include <sys/types.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <functional>
#include <vector>
using namespace std;

typedef function<void()> func;

long long count = 0;
vector<func> callbacks;

void Count()
{
    cout << "count:" << count << endl;
}

void Log()
{
    cout << "打印日志" << endl;
}

void User()
{
    if(fork() == 0)
    {
        execl("/usr/bin/who", "who");
        exit(1);
    }
}

void hander(int sig)
{
    cout << "killsignal:" << sig << endl;
    for(auto e : callbacks)
    {
        e();
    }
    alarm(1); // 重新设置闹钟
}

int main()
{
    // 2. 软件产生信号，闹钟， alarm
    signal(SIGALRM, hander);
    callbacks.push_back(Count);
    callbacks.push_back(Log);
    callbacks.push_back(User);

    alarm(1);
    while (true)
    {
        ++count;
    }

    // 1. 系统调用接口
    // signal(SIGPIPE, hander); // SIGKILL 更改信号处理无效
    // kill(getpid(), SIGPIPE);
    // raise(SIGPIPE);
    // signal(SIGABRT, hander);// SIGABRT 可以更改信号行为，但还是会退出
    // abort();
    // while(true)
    // {
    //     sleep(1);
    // }
    return 0;
}